# -*- coding: utf-8 -*-
"""
学习科目模型
目的：存储用户创建的学习科目信息，支持多科目打卡管理
职责：管理学习科目的基本信息、目标天数、公开状态等
"""
from sqlalchemy import Column, Integer, String, Text, DateTime, SmallInteger
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy.sql import func

Base = declarative_base()

class StudySubject(Base):
    """
    学习科目数据模型
    目的：为打卡功能提供科目分类，用户可以为不同的学习内容创建不同的科目
    功能：存储科目的名称、描述、图标、颜色、目标天数等信息
    """
    __tablename__ = 'study_subjects'

    # 科目唯一标识符，主键，自增
    id = Column(Integer, primary_key=True, autoincrement=True, comment='科目唯一标识符')

    # 科目名称，如：数学、英语、Python学习、算法练习等
    name = Column(String(100), nullable=False, comment='科目名称')

    # 科目描述，详细说明该科目的学习内容和目标
    description = Column(Text, nullable=True, comment='科目描述')

    # 科目图标路径，用于UI展示
    icon = Column(String(255), nullable=True, comment='科目图标路径')

    # 科目颜色标识，用于UI展示和分类，默认蓝色
    color = Column(String(20), nullable=True, default='#1890ff', comment='科目颜色标识')

    # 目标打卡天数，0表示无限制，用户可以设置学习目标
    target_days = Column(Integer, nullable=False, default=0, comment='目标打卡天数，0表示无限制')

    # 创建者用户ID，外键关联users表，标识该科目的所有者
    user_id = Column(Integer, nullable=False, comment='创建者用户ID')

    # 是否公开，0-私有（仅自己可见），1-公开（其他用户可见并使用）
    is_public = Column(SmallInteger, nullable=False, default=0, comment='是否公开：0-私有，1-公开')

    # 排序顺序，数字越小越靠前，用于自定义科目显示顺序
    sort_order = Column(Integer, nullable=False, default=0, comment='排序顺序')

    # 状态，0-禁用（不可用于打卡），1-启用（可正常使用）
    status = Column(SmallInteger, nullable=False, default=1, comment='状态：0-禁用，1-启用')

    # 创建时间，记录科目创建的时间
    created_at = Column(DateTime, nullable=False, default=func.now(), comment='创建时间')

    # 更新时间，记录科目最后修改的时间
    updated_at = Column(DateTime, nullable=False, default=func.now(),
                       onupdate=func.now(), comment='更新时间')

    def to_dict(self):
        """
        将科目对象转换为字典格式
        目的：方便API响应序列化，将数据库模型转换为JSON可序列化的格式
        功能：返回包含科目所有字段的字典

        Returns:
            dict: 包含科目所有信息的字典对象
        """
        return {
            'id': self.id,
            'name': self.name,
            'description': self.description,
            'icon': self.icon,
            'color': self.color,
            'target_days': self.target_days,
            'user_id': self.user_id,
            'is_public': self.is_public,
            'sort_order': self.sort_order,
            'status': self.status,
            'created_at': self.created_at.isoformat() if self.created_at else None,
            'updated_at': self.updated_at.isoformat() if self.updated_at else None
        }
